
#include <iostream>
#include <string>
#include <memory>
#include <mutex>

class Logger {
public:
    // 获取单例实例的静态方法
    static Logger& getInstance() {
        // C++11 保证静态局部变量的线程安全性
        static Logger instance;
        return instance;
    }

    // 禁用拷贝构造和赋值操作符，防止生成新的实例
    Logger(const Logger&) = delete;
    Logger& operator=(const Logger&) = delete;

    // 日志记录方法
    void log(const std::string& message) {
    	std::lock_guard<std::mutex> lock(logMutex); // 确保线程安全
        std::cout << "[Log]: " << message << std::endl;
    }

private:
     std::mutex logMutex;    // 用于多线程安全的互斥锁
    // 私有构造函数，确保无法直接实例化
    Logger() {
        std::cout << "Logger initialized." << std::endl;
    }

    // 私有析构函数，避免在程序结束前提前销毁实例
    ~Logger() = default;
};

int main() {
    // 通过 getInstance 获取单例对象
    Logger& logger = Logger::getInstance();
    logger.log("Singleton pattern in action!");
    std::cout << "logger address: " << &logger << std::endl; 	

    // 尝试获取另一个实例
    Logger& anotherLogger = Logger::getInstance();
    anotherLogger.log("Only one instance exists.");
    std::cout << "anotherLogger address: " << &anotherLogger << std::endl; 
    
    return 0;
}
